/**
 * @file
 * @brief   应用程序类定义文件。
 * @author  赵一
 * @date    2012/01/07
 * @version 0.1
 */

/**
 * @package com.happybluefin.tapburstfree.application 应用程序包。
 */
package com.happybluefin.tapburstfree.application;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import com.happybluefin.android.utility.thirdpart.rankinglist.ScoreloopSDK;
import com.happybluefin.android.utility.thirdpart.statistics.UmengSDK;
import com.happybluefin.tapburstfree.R;
import com.happybluefin.tapburstfree.message.Define;

/**
 * @class  TapBurstFreeApplication
 * @brief  应用程序类。
 * @author 赵一
 */
public class TapBurstFreeApplication extends Application {
    /**
     * @brief  应用程序建立函数。
     * @author 赵一
     */
    public void onCreate() {
        //Log.d(TAG, "onCreate() start");

        //取得上下文
        mContext = this;

        //初始化语言数组
        _initLanguage();

        //初始化在线参数
        _loadOnlineConfig();

        //初始化排行榜
        _initLeaderboards();
        
        //Log.d(TAG, "onCreate() end");
    }

    /**
     * @brief     提交分数函数。
     * @author    赵一
     * @param[in] boardName 排行榜名称。
     * @param[in] score     分数。
     */
    public static void reportScore(String boardName, int score) {
        //Log.d(TAG, "reportScore() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.REPORT_SCORE);
            bundle.putString("BOARDNAME", boardName);
            bundle.putInt("SCORE", score);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "reportScore(): mContext is NULL.");
        }

        //Log.d(TAG, "reportScore() end");
    }

    /**
     * @brief     显示排行榜函数。
     * @author    赵一
     * @param[in] boardName 排行榜名称。
     */
    public static void showLeaderBoard(String boardName) {
        //Log.d(TAG, "showLeaderBoard() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.SHOW_LEADERBOARD);
            bundle.putString("BOARDNAME", boardName);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "showLeaderBoard(): mContext is NULL.");
        }

        //Log.d(TAG, "showLeaderBoard() end");
    }

    /**
     * @brief     分享文本函数。
     * @author    赵一
     * @param[in] text 分享内容。
     */
    public static void shareText(String text) {
        //Log.d(TAG, "shareText() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.SHARE_TEXT);
            bundle.putString("TEXT", text);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "shareText(): mContext is NULL.");
        }

        //Log.d(TAG, "shareText() end");
    }

    /**
     * @brief     打开网页函数。
     * @author    赵一
     * @param[in] url 网页地址。
     */
    public static void gotoUrl(String url) {
        //Log.d(TAG, "gotoUrl() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.WEB_BROWSER);
            bundle.putString("URL", url);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "gotoUrl(): mContext is NULL.");
        }

        //Log.d(TAG, "gotoUrl() end");
    }

    /**
     * @brief     取得本地字符串函数。
     * @author    赵一
     * @param[in] index 字符串索引键值。
     * @return    本地字符串。
     */
    public static String getLocalizedString(String index) {
        //Log.d(TAG, "getLocalizedString() start");

        String text = index;

        if ((mContext != null) && (index != null)) {
            //Log.d(TAG, "getLocalizedString() index: " + index);
//          mContext.getString(resId);
            
            text = mLanguage.get(index);
            if (text == null) {
                Log.e(TAG, "getLocalizedString(): unknow index: " + index);
                text = index;
            }
        }

        //Log.d(TAG, "getLocalizedString() end");

        return text;
    }

    /**
     * @brief  判断是否为中文本地字符函数。
     * @author 赵一
     * @return true  中文本地字符。
     * @return false 非中文本地字符。
     */
    public static boolean isChinese() {
        //Log.d(TAG, "isChinese() start");

        boolean ret = false;

        Locale locale = Locale.getDefault();
        String language = locale.getLanguage();

        if (language.equals("zh")) {
            ret = true;
        }

        //Log.d(TAG, "isChinese() end");

        return ret;
    }

    /**
     * @brief  取得城市代码函数。
     * @author 赵一
     * @return 城市代码。
     */
    public static String getCountryCode() {
        //Log.d(TAG, "getCountryCode() start");

        Locale locale = Locale.getDefault();
        String country = locale.getCountry();

        //Log.d(TAG, "getCountryCode() end");

        return country;
    }

    /**
     * @brief  取得语言代码函数。
     * @author 赵一
     * @return 语言代码。
     */
    public static String getLanguageCode() {
        //Log.d(TAG, "getLanguageCode() start");

        Locale locale = Locale.getDefault();
        String language = locale.getLanguage();

        //Log.d(TAG, "getLanguageCode() end");

        return language;
    }

    /**
     * @brief     Umeng取得在线参数函数。
     * @author    赵一
     * @param[in] name 在线参数键值。
     * @return    Umeng在线参数。
     */
    public static int umengGetParamValue(String name) {
        //Log.d(TAG, "umengGetParamValue() start");

        int ret = UmengSDK.getConfigIntParams(mContext, name, 0);

        //Log.d(TAG, "umengGetParamValue() end");

        return ret;
    }

    /**
     * @brief     Umeng自定义事件函数。
     * @author    赵一
     * @param[in] name  自定义事件键值。
     * @param[in] value 自定义事件数值。
     */
    public static void umengCustomEvent(String name, String value) {
        //Log.d(TAG, "umengCustomEvent() start");

        if (mContext != null) {
            UmengSDK.customEvent(mContext, name, value);
        }

        //Log.d(TAG, "umengCustomEvent() end");
    }

    /**
     * @brief  退出函数。
     * @author 赵一
     */
    public static void exitApplication() {
        //Log.d(TAG, "exitApplication() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.EXIT_APPLICATION);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "exitApplication(): mContext is NULL.");
        }

        //Log.d(TAG, "exitApplication() end");
    }

    /**
     * @brief  评价函数。
     * @author 赵一
     */
    public static void gotoReview() {
        //Log.d(TAG, "gotoReview() start");

        if (mContext != null) {
            Bundle bundle = new Bundle();
            Intent intent = new Intent(Define.Action.ACTION);
            bundle.putInt("TYPE", Define.MessageID.GOTO_REVIEW);
            intent.putExtras(bundle);
            mContext.sendBroadcast(intent);
        }
        else {
            Log.e(TAG, "gotoReview(): mContext is NULL.");
        }

        //Log.d(TAG, "gotoReview() end");
    }

    /**
     * @brief  初始化语言数组函数。
     * @author 赵一
     */
    private void _initLanguage() {
        //Log.d(TAG, "_initLanguage() start");

        mLanguage.put("fontNormal", getString(R.string.font_normal));
        mLanguage.put("language", getString(R.string.language));
        mLanguage.put("Level Select", getString(R.string.level_select));
        mLanguage.put("Goal", getString(R.string.goal));
        mLanguage.put("Time", getString(R.string.time));
        mLanguage.put("Start", getString(R.string.start));
        mLanguage.put("Result", getString(R.string.result));
        mLanguage.put("Mission %d", getString(R.string.mission_x));
        mLanguage.put("Close", getString(R.string.close));
        mLanguage.put("Mission Failed!", getString(R.string.mission_failed));
        mLanguage.put("Give Up", getString(R.string.give_up));
        mLanguage.put("Leaderboard", getString(R.string.leaderboard));
        mLanguage.put("More Game", getString(R.string.more_game));
        mLanguage.put("Retry", getString(R.string.retry));
        mLanguage.put("High score!", getString(R.string.high_score1));
        mLanguage.put("High score:", getString(R.string.high_score2));
        mLanguage.put("Mission Complete!", getString(R.string.mission_complete));
        mLanguage.put("All Clear!!!", getString(R.string.all_clear));
        mLanguage.put("Play Single", getString(R.string.play_single));
        mLanguage.put("Play Double", getString(R.string.play_double));
        mLanguage.put("Chellange", getString(R.string.chellange));
        mLanguage.put("Next Goal:", getString(R.string.next_goal));
        mLanguage.put("<< Back", getString(R.string.back));
        mLanguage.put("Again", getString(R.string.again));
        mLanguage.put("Next", getString(R.string.next));
        mLanguage.put("TOUCH TO START", getString(R.string.touch_to_start));
        mLanguage.put("High:", getString(R.string.high));
        mLanguage.put("FINISH", getString(R.string.finish));
        mLanguage.put("ShareMsgNormal", getString(R.string.share_msg_normal));
        mLanguage.put("ShareMsgChellange", getString(R.string.share_msg_chellange));
        mLanguage.put("Come to challange highest score!", getString(R.string.come_to_challange_highest_score));
        mLanguage.put("Your friend get a new higher score. Beat It!", getString(R.string.your_friend_get_a_new_higher_score_beat_it));
        mLanguage.put("Review", getString(R.string.review));
        mLanguage.put("ReviewMsg", getString(R.string.review_msg));
        mLanguage.put("GoReview", getString(R.string.go_review));

        //Log.d(TAG, "_initLanguage() end");
    }

    /**
     * @brief  加载在线参数函数。
     * @author 赵一
     */
    private void _loadOnlineConfig() {
        //Log.d(TAG, "_loadOnlineConfig() start");

        mIsFBEnable = UmengSDK.getConfigIntParams(this, "isFBEnable", 0);
        mIsAdBannerEnable = UmengSDK.getConfigIntParams(this, "isAdBannerEnable", 1);
        mIsMoreEnable = UmengSDK.getConfigIntParams(this, "isMoreEnable", 0);
        mIsAdPushEnable = UmengSDK.getConfigIntParams(this, "isAdPushEnable", 0);

        //Log.d(TAG, "_loadOnlineConfig() end");
    }

    /**
     * @brief  初始化排行榜函数。
     * @author 赵一
     */
    private void _initLeaderboards() {
        //Log.d(TAG, "_initLeaderboards() start");

        ScoreloopSDK.init(this, getScoreLoopSecretID());

        //Log.d(TAG, "_initLeaderboards() end");
    }

    /**
     * @brief  取得芒果广告ID函数。
     * @author 赵一
     * @return 芒果广告ID。
     */
    public static native String getAdsMogoAppID();

    /**
     * @brief  取得ScoreLoopID函数。
     * @author 赵一
     * @return ScoreLoopID。
     */
    public static native String getScoreLoopSecretID();

    static {
        try {
            //加载游戏动态链接库
            System.loadLibrary("game");
        }
        catch (UnsatisfiedLinkError e) {
            e.printStackTrace();
            throw e;
        }
    }

    /**
     * @brief 上下文。
     */
    private static Context mContext = null;

    /**
     * @brief 日志标记。
     */
    private static final String TAG = "TapBurstFreeApplication";

    /**
     * @brief 语言数组。
     */
    private static Map<String, String> mLanguage = new HashMap<String, String>();

    /**
     * @brief 在线参数配置(Facebook选项标志)。
     */
    public static int mIsFBEnable = 0;

    /**
     * @brief 在线参数配置(Banner广告选项标志)。
     */
    public static int mIsAdBannerEnable = 1;

    /**
     * @brief 在线参数配置(更多选项 标志)。
     */
    public static int mIsMoreEnable = 0;

    /**
     * @brief 在线参数配置(Push广告标志)。
     */
    public static int mIsAdPushEnable = 0;
}
